package internet_project.Client_Service;


import internet_project.common.Message;
import internet_project.common.MessageType;
import internet_project.common.User;

import java.io.*;
import java.net.Socket;

/**
 * 用于服务客户端 ->各种函数.....功能
 */

public class Service {
  String IP = "192.168.93.1";// 连接 的 服务 IP
  Client_Connect_Server_Thread ccst;//目前 只有 客户端 一条 管道通信线程

  User u = new User();

  // 把socket做成全局变量 ，以后要用
  private Socket socket;

  public void File_send(String local_path, String userid) {
    File file = new File(local_path);
    //过关斩将判断
    if (!(file.exists())) {//判断文件存不存在
      System.out.println("！！！路径错误,文件不存在!");
      return;
    }
    // 用户存不存在？
    this.get_userlist();//主动调用请求列表方法
    String[] user_list = ccst.User_List;

    if (user_list == null) {
      System.out.println("该用户不在线或不存在！！！");
      return;//出
    }

    int loop = -1;

    for (String s : user_list) {
      if (s.equals(userid)) loop = 2;
    }

    if (loop == -1) {
      System.out.println("该用户不在线或不存在！！！");
      return;
    }


    try {
      int len = (int) file.length();
      byte[] bytes = new byte[len];
      FileInputStream fis = new FileInputStream(local_path);
      // 一次性读满 数组这个东西不好构建（拼接）偏移量
      fis.read(bytes);
      // 构建一个好的message
      Message message = new Message();
      message.setType(MessageType.FILE_SEND);
      message.setFile_data(bytes);
      message.setGet_user(userid);
      message.setDatalen(len);
      message.setSend_user(u.getUserid());
      message.setPath(local_path);

      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
      oos.writeObject(message);

      fis.close();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

  // 与服务 器 切断 连接 -----》 无异常 退出
  public void EXIT() {
    Message message = new Message();
    message.setType(MessageType.EXIT);
    message.setSend_user(u.getUserid());
    try {
      //通知 服务
      new ObjectOutputStream(socket.getOutputStream()).writeObject(message);

    } catch (IOException e) {
      e.printStackTrace();
    }
  }


  // 将信息 发 给 服务 端  ，服务端 帮忙 发 给 所有人
  public void send_All_person(String content) {
    Message message = new Message();
    message.setType(MessageType.SEND_MESSAGE_ALLPERSON);//设置类型
    message.setSend_user(u.getUserid());
    message.setContent(content);

    try {
      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
      oos.writeObject(message);

    } catch (IOException e) {
      e.printStackTrace();
    }
  }


  // 私聊 信息
  public void chat(String username, String content) {
    // 构建 一个 要 准备 发送 的 信息
    Message message = new Message();
    message.setContent(content);
    message.setType(MessageType.MESSAGE);
    // 设置一下 发送者
    message.setSend_user(u.getUserid());
    // 设置 一下接收者
    message.setReceive_user(username);

    try {
      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
      oos.writeObject(message);
      // ok
    } catch (IOException e) {
      e.printStackTrace();
    }
  }


  // 向 服务器 请求 在线用户 列表
  public void get_userlist() {
    // 构建一个message
    Message message = new Message();
    message.setType(MessageType.GET_USER_LIST);
    message.setSend_user(u.getUserid());

    try {
      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
      oos.writeObject(message);//发送 请求 在线 用户 列表


    } catch (IOException e) {
      e.printStackTrace();
    }

  }


  //  向客户端发送信息，检查是否登录成功--》用户存不存在
  public boolean Check_Longin(String userid, String password) {//
    boolean p = false;//标记 Check_Longin 结果
    // 构建一个 临时的 用户对象
    u.setUserid(userid);
    u.setPasswd(password);
    Message mes = null;//辅助 对象

    try {

      // 与服务器端建立管道连接，验证是否登录成功
      // 把用户(对象)发送给服务器端 校验
      socket = new Socket(IP, 8888);
      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
      oos.writeObject(u);

      //接收一下服务器回发的登录结果
      ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
      mes = (Message) ois.readObject();


      if (mes.getType().equals(MessageType.Login_ok)) { //登录成功
        p = true;
        // 将socket input 一直处于 接收 状态 ---》 线程里 一直等待 接收
        ccst = new Client_Connect_Server_Thread(socket);
        ccst.start();//启动线程

        // 为了方便后功能的扩展，做一个管理 通信线程的 集合 存放
        Manage_Socket.add_Client_Connect_Server_Thread(userid, ccst);
      } else {
        // 登录失败 ---》 没有与客户端 建立 管道连接 ，也没有启动线程

        socket.close(); //关闭 资源

      }

    } catch (Exception e) {
      e.printStackTrace();
    }

    return p;
  }


  public Client_Connect_Server_Thread getCcst() {
    return ccst;
  }

  public void setCcst(Client_Connect_Server_Thread ccst) {
    this.ccst = ccst;
  }

  public User getU() {
    return u;
  }


  public Socket getSocket() {
    return socket;
  }

  public void setSocket(Socket socket) {
    this.socket = socket;
  }
}
